/******************************************************
 * @file touchsreen.c
 * @author Destiny 
 * @brief 触摸屏相关函数
 * 
 * @version 0.1
 * @date 2024-07-18
 *****************************************************/
#include <config.h>
#include <input_manager.h>
#include <disp_manager.h>
#include <stdlib.h>
#include <linux/input.h>
#include <tslib.h>

static struct tsdev *g_tTSDev;   /*触摸设备结构体指针*/
static int giXres;
static int giYres;
/*
 * @description		    	: 触摸屏设备初始化函数
 * @param - 				: 无
 * @return 			    	: 0 成功;其他 失败
 */
static int TouchScreenDevInit(void)
{

	g_tTSDev = ts_setup(NULL,0);   /*如果nonblock 等于 0 表示阻塞方式，如果为非 0 值则表示以非阻塞方式打开。*/
    if(g_tTSDev == NULL)
    {
        perror("open TSDevice error!");
        return -1;
    }

	// char *pcTSName = NULL;
	int iBpp;

	// if ((pcTSName = getenv("TSLIB_TSDEVICE")) != NULL ) 
	// {
	// 	g_tTSDev = ts_open(pcTSName, 0);  
	// }
	// else
	// {
	// 	g_tTSDev = ts_open("/dev/event0", 1);
	// }

	// if (!g_tTSDev) {
	// 	DBG_PRINTF(DLOG_LVL_ERROR,DLOG_TAG,APP_ERR"ts_open error!\n");
	// 	return -1;
	// }

	// if (ts_config(g_tTSDev)) {
	// 	DBG_PRINTF(DLOG_LVL_ERROR,DLOG_TAG,"ts_config error!\n");
	// 	return -1;
	// }

	if (GetDispResolution(&giXres, &giYres, &iBpp))
	{
		return -1;
	}

	return 0;
}
/*
 * @description		    	: 触摸屏设备注销函数
 * @param - 				: 无
 * @return 			    	: 0 成功;其他 失败
 */
static int TouchScreenDevExit(void)
{
	return 0;
}

/*
	struct ts_sample {


    int      x;        // 触摸点的 X 坐标
    int      y;        // 触摸点的 Y 坐标
	ussigner int pressure; // 触摸点的压力值
	struct timeval tv;   //时间
	};
*/
/*
 * @description		    	: 触摸屏输入事件获取函数
 * @param - ptInputEvent	: 输入数据描述结构体指针
 * @return 			    	: 0 成功;其他 失败
 */
static int TouchScreenGetInputEvent(PT_InputEvent ptInputEvent)
{
	struct ts_sample tSamp;
	int iRet;	

	while (1)
	{
		iRet = ts_read(g_tTSDev, &tSamp, 1);   /*读取触摸屏输入*/
		if (iRet == 1)
		{
			ptInputEvent->tTime        = tSamp.tv;
			// ptInputEvent->iType        = EV_KEY;       
			ptInputEvent->iX           = tSamp.x;
			ptInputEvent->iY           = tSamp.y;
			ptInputEvent->iPressure    = tSamp.pressure;
			ptInputEvent->iInputDevice = INPUT_DEVICE_TOUCHSCREEN;
			DBG_PRINTF(DLOG_LVL_DEBUG,DLOG_TAG,"iX :%d iY:%d iPressure:%d\r\n",ptInputEvent->iX,ptInputEvent->iY,ptInputEvent->iPressure);
			return 0;
		}
		else
		{
			return -1;
		}
	}
	return 0;
}
/* 触摸屏设备结构体 */
static T_InputOpr g_tTouchScreenOpr = {
	.name          = "touchscreen",
	.DeviceInit    = TouchScreenDevInit,
	.DeviceExit    = TouchScreenDevExit,
	.GetInputEvent = TouchScreenGetInputEvent,
};

int TouchScreenInit(void)
{
	return RegisterInputOpr(&g_tTouchScreenOpr);
}

